package main

import "fmt"

// 定义一个结构体类型
type Person struct {
	Name string
	Age  int
}

// func关键词 ()
// 实例化对象调用方法时，receiver为对象本身
func (receiver Person) personInfo() {
	fmt.Printf("Name: %s, Age: %d\n", receiver.Name, receiver.Age)
}

// 方法体内部不用接收器时，可以这样写
func (Person) personInfo2() {
	fmt.Println("Hello")
}

// 指针接收者
func (p *Person) setInfo(name string, age int) {
	p.Name = name
	p.Age = age
}

// 接收者
func (p Person) setInfo2(name string, age int) {
	// 普通类型，p赋值给了p1，两个变量没有任何的关联
	p.Name = name
	p.Age = age
}

func main() {
	fmt.Println("Hello World")

	var p1 = &Person{
		Name: "张三",
		Age:  18,
	}
	p1.personInfo()
	p1.personInfo2()
	p1.setInfo("lishi", 30)
	fmt.Printf("%+v\n", p1)
	p1.setInfo2("lishi4444", 320)
	fmt.Printf("%+v\n", p1)
}
